物件導向的設計中,關於建構物件的方式我們成為建構器(constructor),這關係到物件使用的方式,是很重要的事情。
Photo by @kellysikkema on Unsplash
而 Objective-C 的物件因為都是繼承自 NSObject,這代表所有的 物件將會自帶有 init()
的建構器。在我們可以透過 @available(*, unavailable)
的方式透過編譯器的阻擋來限制
// Swift
class Base { init() {}}
class Sub: Base {
@available(*, unavailable, message: "please using init(name:)")
override init() {fatalError("Will never perform")}
init(name:String) {
super.init()
...
}
}
let sub = Sub() // 'init()' is unavailable: please using init(name:)
關於
@avaliable
,請參考 Attributes — The Swift Programming Language
NS_UNAVAILABLE
在 Objective-C 我們可以使用同樣的方式來表達 unavailable
,透過 NS_UNAVAILABLE
,而 Swift interface 則可以透過這個關鍵字提供錯誤呼叫的提示。
// Objective-C
@interface OCSub: NSObject
-(instancetype) init NS_UNAVAILABLE;
@end
OCSub* sub = [[OCSub alloc] init]; // 'init' is unavailable
Swift 很強調關於 init 的可讀性,convenience init
是在 class 提供多種建構器時必須要有的語法提示。在 Objective-C 並沒有這樣強制的語法,然而對於 Swift 開發者理解的部分我們可以使用 NS_DESIGNATED_INITIALIZER
來提供 Swift interface 關鍵字。
Objective-C 使用
NS_DESIGNATED_INITIALIZER
來確定建構器的關係。
@available(*, unavailable) init()
與 init() {fatalError()}
在開發者的角度上,你比較偏好哪個?補上 NS_SWIFT_UNAVAILABLE("Use a dictionary literal instead.");
來自 https://developer.apple.com/documentation/swift/objective-c_and_c_code_customization/making_objective-c_apis_unavailable_in_swift